/*
 * TacticaMLinares.java
 *
 * Created on 1 de abril de 2007, 13:53
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package futbol.tacticas.concursantes2007.CapitanesEOSA;

import futbol.tacticas.concursantes.Tactica;

import java.awt.Color;
import java.awt.Point;
import java.util.Vector;

import futbol.General;
import futbol.tacticas.Comando;
import futbol.tacticas.ComandoGolpearBola;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.ComandoTiroAPuerta;
import futbol.tacticas.SituacionJugadores;


/**
 * @author Miguel Linares de la Puerta
 */
public class TacticaMGL implements Tactica {

	private int nValores[][] = { 
			{ -160, 0, 6 }, // Jugador 1
			{ -120, 0, 5 }, // Jugador 2
			{ -110, 30, 5 }, // Jugador 3
			{ -110, -30, 5 }, // Jugador 4
			{ -90, 70, 5 }, // Jugador 5
			{ -90, -70, 6 }, // Jugador 6
			{ -30, 25, 7 }, // Jugador 7
			{ -30, -25, 6 }, // Jugador 8
			{ 50, -5, 5 }, // Jugador 9
			{ 80, 30, 6 }, // Jugador 10
			{ 110, -20,7 } // Jugador 11
	};

	public Color getColor1() {
		return Color.decode("#FF9900");
	}

	public Color getColor2() {
		return Color.BLACK;
	}

	public Color getColorNumero() {
		return Color.WHITE;
	}

	public String getNombre() {
		return "Capitanes EOS A";
	}

	public int getFuerza(int n) {
		return nValores[n][2];
	}

	public int getXInicial(int n) {
		return nValores[n][0];
	}

	public int getYInicial(int n) {
		return nValores[n][1];
	}

	public Vector<Comando> getComandos(SituacionJugadores sj) {
		Vector<Comando> com = new Vector();
		// Posicionamiento
		for (int n = 0; n < 11; n++) {
			com.add(new ComandoIrA(n, nValores[n][0], nValores[n][1]));
		}

		Point balon = sj.getBola();
		Point misJugadores[] = sj.getMisJugadores();
		Point contrarios[] = sj.getContrario();

		// Mejorar defensa
		if (!sj.estoyMasCercaDeBola() || balon.getX() < 0) {
			for (int n = 1; n < 4; n++) {
				int nJC = sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
				com.add(new ComandoIrA(n, contrarios[nJC].getX() + 10, contrarios[nJC].getY()));
			}
		}

		// Movimiento portero
		int y = (int) (balon.getY() / 2);
		if (y < -20) y = -20;
		if (y > 20) y = 20;
		com.add(new ComandoIrA(0, nValores[0][0], y));

		// Movimiento mas cercano a la balon
		int nJug = sj.getMasCercanoDeBola();
		com.add(new ComandoIrA(nJug, balon.getX(), balon.getY()));

		int nHeuMejor = 9999999;
		int xMej = 0, yMej = 0;
		int xOriginal = 0, yOriginal = 0, nHeu;
		for (int n = 0; n < 100; n++) {
			xOriginal = (int) (Math.random() * 340) - 170;
			yOriginal = (int) (Math.random() * 240) - 120;
			nHeu = mejoraPase(sj, xOriginal, yOriginal);
			if (nHeuMejor > nHeu) {
				nHeuMejor = nHeu;
				xMej = xOriginal;
				yMej = yOriginal;
			}
		}

		for (int n = 0; n < 11; n++) {
			if (misJugadores[n].getX() > 75) {
				int desvio = -(int) (balon.getY() % misJugadores[n].getY());
				com.add(new ComandoTiroAPuerta(n, desvio));
			} else {
				com.add(new ComandoGolpearBola(n, xMej, yMej));
			}

		}

		return com;
	}

	private int mejoraPase(SituacionJugadores sj, int x, int y) {
		int nHeu = y * 5 - x * 100;
		Point misJugadores[] = sj.getMisJugadores();
		for (int n = 0; n < 11; n++) {
			int nDis = (int) (General.getDistancia(x, y, misJugadores[n].getX(), misJugadores[n].getY()));
			if (nDis < 75) nHeu -= 1000;
		}

		Point contrarios[] = sj.getContrario();
		for (int n = 0; n < 11; n++) {
			int nDis = (int) (General.getDistancia(x, y, contrarios[n].getX(), contrarios[n].getY()));
			if (nDis < 75) nHeu += 1000;
		}
		return nHeu;
	}

}
